{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import datetime\n",
    "from sklearn.svm import SVC,LinearSVC\n",
    "from sklearn.ensemble import RandomForestClassifier,AdaBoostClassifier\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "import lightgbm as lgb \n",
    "from sklearn.model_selection import train_test_split,GridSearchCV\n",
    "import tensorflow as tf\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "from sklearn.metrics import accuracy_score,recall_score\n",
    "from sklearn.feature_selection import SelectKBest,SelectPercentile,SelectFromModel,chi2,f_classif,mutual_info_classif,RFE\n",
    "from scipy.stats import pearsonr\n",
    "from sklearn.ensemble import RandomForestRegressor,RandomForestClassifier\n",
    "from sklearn.svm import SVC,LinearSVC,LinearSVR,SVR\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "import gc\n",
    "import pickle\n",
    "import matplotlib.pyplot as plt\n",
    "import time\n",
    "from collections import OrderedDict\n",
    "from keras.layers import Input, Dense, LSTM\n",
    "from keras.models import Model\n",
    "from keras.layers import *\n",
    "from keras.models import *\n",
    "from keras.optimizers import Adam\n",
    "from keras.callbacks import EarlyStopping\n",
    "import keras.backend as K"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "start_date = '2008-05-01'\n",
    "end_date = '2018-05-31'\n",
    "\n",
    "test_start_date = '2018-06-01'\n",
    "test_end_date = '2019-12-28'\n",
    "start_year = start_date[:4]\n",
    "end_year = end_date[:4]\n",
    "\n",
    "select_index = '000300.XSHG'\n",
    "next_n = 3 #data_y延期n月\n",
    "\n",
    "start_quarter = '2008-05'\n",
    "start_month = '2008-05'\n",
    "\n",
    "seq_len = 5 #lstm back num"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "res =  pd.read_csv(\"data/沪深300月度宏观经济数据1.csv\",header=0,index_col=0,sep='\\s+',parse_dates=[1])\n",
    "res_a = pd.read_csv(\"data/沪深300月度宏观经济数据2.csv\",header=0,index_col=0,sep='\\s+',parse_dates=[1])\n",
    "price = pd.read_csv(\"data/沪深300每日交易close价格.csv\",header=0,index_col=0,sep='\\s+',parse_dates=[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "res.index = res['stat_month']\n",
    "res_a.index = res_a['stat_month']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_macro_data(ml,sd, ed):\n",
    "    res_ = res.loc[ml[0]:ml[-1]]\n",
    "    res_a_ = res_a.loc[ml[0]:ml[-1]]\n",
    "    price_ = price.loc[sd:ed]\n",
    "    return [res_, res_a_, price_]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_year_list(start_year,end_year):\n",
    "    sy = int(start_year)\n",
    "    ey = int(end_year)\n",
    "    l = []\n",
    "    for i in range(sy,ey+1):\n",
    "        l.append(str(i))\n",
    "    return l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_quarter_list(start_year,end_year):\n",
    "    sy = int(start_year)\n",
    "    ey = int(end_year)\n",
    "    l = []\n",
    "    for y in range(sy,ey+1):\n",
    "        for q in range(3,13,3):\n",
    "            if q < 10:\n",
    "                s = str(y) + '-' + '0' + str(q)\n",
    "                l.append(s)\n",
    "            else:\n",
    "                s = str(y) + '-' +  str(q)\n",
    "                l.append(s)\n",
    "    return l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_month_list(start_date,end_date):\n",
    "    sy = int(start_date[:4])\n",
    "    ey = int(end_date[:4])\n",
    "    sm = int(start_date[5:7])\n",
    "    em = int(end_date[5:7])\n",
    "    l = []\n",
    "    for y in range(sy,ey+1):\n",
    "        if y == sy:\n",
    "            for i in range(sm,13):\n",
    "                if i< 10:\n",
    "                    s = str(y) + '-' + '0' + str(i)\n",
    "                    l.append(s)\n",
    "                else:\n",
    "                    s = str(y) + '-' +  str(i)      \n",
    "                    l.append(s)\n",
    "               \n",
    "        elif y == ey:\n",
    "            for i in range(1,em+1):\n",
    "                if i < 10:\n",
    "                    s = str(y) + '-' + '0' + str(i)\n",
    "                    l.append(s)\n",
    "                else:\n",
    "                    s = str(y) + '-' +  str(i)\n",
    "                    l.append(s)\n",
    "        else:           \n",
    "            for i in range(1,13):\n",
    "                if i < 10:\n",
    "                    s = str(y) + '-' + '0' + str(i)\n",
    "                    l.append(s)\n",
    "                else:\n",
    "                    s = str(y) + '-' +  str(i)\n",
    "                    l.append(s)\n",
    "    return l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "#获取月度价格数据\n",
    "def get_price_month_data(price_day,n='mean',mean_num=1):\n",
    "    '''\n",
    "    :param price: 输入价格数据，index为datetime类型\n",
    "    :param type: 计算方式，’mean‘取月平均值，若为int,则从第几个交易日开始计算均值，长度为mean_num，\n",
    "    :param mean_num: 计算均值的长度\n",
    "    :return:\n",
    "    '''\n",
    "    ind = list(price_day.index)\n",
    "    s_ind = [datetime.datetime.strftime(i, '%Y%m%d') for i in ind]\n",
    "    price_day.index = s_ind\n",
    "    num_ind = [int(i) for i in s_ind]\n",
    "    cut_ind = [int(i / 100) for i in num_ind]\n",
    "    cut_s_ind = [(str(i)[:4] + '-' + str(i)[4:]) for i in cut_ind]\n",
    "    price_day['stat_date'] = cut_s_ind\n",
    "    if n == 'mean':\n",
    "        res = price_day.groupby(by=['stat_date']).mean()\n",
    "    else:\n",
    "        ind_sig = list(set(price['stat_date'].values))\n",
    "        index_list = []\n",
    "        mean_list = []\n",
    "        for ind in ind_sig:\n",
    "            df = price[price['stat_date']==ind]\n",
    "            sel_df = df.iloc[n-1:n+mean_num-1,0]\n",
    "            index = list(sel_df.index)\n",
    "            if len(index) == 0:\n",
    "                continue\n",
    "            index = index[0]\n",
    "            index_list.append(index)\n",
    "            mean_df = sel_df.mean()\n",
    "            mean_list.append(mean_df)\n",
    "        res_df = pd.DataFrame(mean_list,index=index_list,columns=['month_price'])\n",
    "        res = res_df.sort_index()\n",
    "        res_index = list(res.index)\n",
    "        ind_s_cut = [i[:4] + '-' + i[4:6] for i in res_index]\n",
    "        res.index = ind_s_cut\n",
    "    return res"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_pure_values(data):\n",
    "    '''\n",
    "    获取纯净数值，将DataFrame中的非数值项剔除，例如‘code’项（str）\n",
    "    input:\n",
    "    data:pd.DataFrame,index为股票代码\n",
    "    putput:\n",
    "    DataFrame：只含数值项\n",
    "    '''\n",
    "    columns = list(data.columns)\n",
    "    for column in columns:\n",
    "        if not(isinstance(data[column][0],int) or isinstance(data[column][0],float)):\n",
    "            data = data.drop([column],axis=1)\n",
    "    return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [],
   "source": [
    "def winsorize_and_standarlize(data, qrange=[0.05, 0.95], axis=0):\n",
    "    if isinstance(data, pd.DataFrame):\n",
    "        if axis == 0:\n",
    "            q_down = data.quantile(qrange[0])\n",
    "            q_up = data.quantile(qrange[1])\n",
    "            col = data.columns\n",
    "            for n in col:\n",
    "                data[n][data[n] > q_up[n]] = q_up[n]\n",
    "                data[n][data[n] < q_down[n]] = q_down[n]\n",
    "            data = (data - data.mean()) / data.std()\n",
    "            data = data.fillna(0)\n",
    "        else:\n",
    "            data = data.stack()\n",
    "            data = data.unstack(0)\n",
    "            q_down = data.quantile(qrange[0])\n",
    "            q_up = data.quantile(qrange[1])\n",
    "            col = data.columns\n",
    "            for n in col:\n",
    "                data[n][data[n] > q_up[n]] = q_up[n]\n",
    "                data[n][data[n] < q_down[n]] = q_down[n]\n",
    "            data = (data - data.mean()) / data.std()\n",
    "            data = data.stack().unstack(0)\n",
    "            data = data.fillna(0)\n",
    "\n",
    "    elif isinstance(data, pd.Series):\n",
    "        q_down = data.quantile(qrange[0])\n",
    "        q_up = data.quantile(qrange[1])\n",
    "        data[data > q_up] = q_up\n",
    "        data[data < q_down] = q_down\n",
    "        data = (data - data.mean()) / data.std()\n",
    "    return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_profit_class(data):\n",
    "    '''\n",
    "    对数据进行分类标记\n",
    "    '''\n",
    "    data_diff = data.diff(next_n)\n",
    "    data_diff[data_diff > 0] = 1\n",
    "    data_diff[data_diff < 0] = 0\n",
    "    #data_diff[data_diff == 2] = -1\n",
    "    #data_diff[data_diff == -2] = 1\n",
    "    return data_diff\n",
    "\n",
    "def get_final_data(input_x,input_y):\n",
    "    input_y = input_y.shift(-next_n).to_frame().fillna(method='ffill')\n",
    "    data_m = pd.merge(input_x,input_y,left_index=True,right_index=True,how='right')\n",
    "    columns_m = data_m.columns\n",
    "    data_x = data_m[columns_m[:-1]]\n",
    "    data_y = data_m[columns_m[-1]]\n",
    "    return data_x,data_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [],
   "source": [
    "class FeatureSelection():\n",
    "    '''\n",
    "    特征选择：\n",
    "    identify_collinear：基于相关系数，删除小于correlation_threshold的特征\n",
    "    identify_importance_lgbm：基于LightGBM算法，得到feature_importance,选择和大于p_importance的特征\n",
    "    filter_select:单变量选择，指定k,selectKBest基于method提供的算法选择前k个特征，selectPercentile选择前p百分百的特征\n",
    "    wrapper_select:RFE，基于estimator递归特征消除，保留n_feature_to_select个特征\n",
    "    '''\n",
    "    def __init__(self):\n",
    "        self.filter_supports = None #bool型，特征是否被选中\n",
    "        self.wrapper_supports = None\n",
    "        self.embedded_supports = None\n",
    "        self.lgbm_columns = None  #选择的特征\n",
    "        self.filter_columns = None\n",
    "        self.wrapper_columns = None\n",
    "        self.embedded_columns = None\n",
    "        self.record_collinear = None #自相关矩阵大于门限值\n",
    "        \n",
    "    def identify_collinear(self, data, correlation_threshold):\n",
    "\n",
    "        columns = data.columns\n",
    "        self.correlation_threshold = correlation_threshold\n",
    "\n",
    "        # Calculate the correlations between every column\n",
    "        corr_matrix = data.corr()\n",
    "        \n",
    "        self.corr_matrix = corr_matrix\n",
    "    \n",
    "        # Extract the upper triangle of the correlation matrix\n",
    "        upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k = 1).astype(np.bool))\n",
    "        # Select the features with correlations above the threshold\n",
    "        # Need to use the absolute value\n",
    "        to_drop = [column for column in upper.columns if any(upper[column].abs() > correlation_threshold)]\n",
    "        obtain_columns = [column for column in columns if column not in to_drop]\n",
    "        self.columns = obtain_columns\n",
    "        # Dataframe to hold correlated pairs\n",
    "        record_collinear = pd.DataFrame(columns = ['drop_feature', 'corr_feature', 'corr_value'])\n",
    "\n",
    "        # Iterate through the columns to drop\n",
    "        for column in to_drop:\n",
    "\n",
    "            # Find the correlated features\n",
    "            corr_features = list(upper.index[upper[column].abs() > correlation_threshold])\n",
    "\n",
    "            # Find the correlated values\n",
    "            corr_values = list(upper[column][upper[column].abs() > correlation_threshold])\n",
    "            drop_features = [column for _ in range(len(corr_features))]    \n",
    "\n",
    "            # Record the information (need a temp df for now)\n",
    "            temp_df = pd.DataFrame.from_dict({'drop_feature': drop_features,\n",
    "                                             'corr_feature': corr_features,\n",
    "                                             'corr_value': corr_values})\n",
    "\n",
    "            # Add to dataframe\n",
    "            record_collinear = record_collinear.append(temp_df, ignore_index = True)\n",
    "\n",
    "        self.record_collinear = record_collinear\n",
    "        return data[obtain_columns]\n",
    "     \n",
    "        \n",
    "    def identify_importance_lgbm(self, features, labels,p_importance=0.8, eval_metric='auc', task='classification', \n",
    "                                 n_iterations=10, early_stopping = True):\n",
    "        \n",
    "        # One hot encoding\n",
    "        data = features\n",
    "        features = pd.get_dummies(features)\n",
    "\n",
    "        # Extract feature names\n",
    "        feature_names = list(features.columns)\n",
    "\n",
    "        # Convert to np array\n",
    "        features = np.array(features)\n",
    "        labels = np.array(labels).reshape((-1, ))\n",
    "\n",
    "        # Empty array for feature importances\n",
    "        feature_importance_values = np.zeros(len(feature_names))\n",
    "        \n",
    "        #print('Training Gradient Boosting Model\\n')\n",
    "        \n",
    "        # Iterate through each fold\n",
    "        for _ in range(n_iterations):\n",
    "\n",
    "            if task == 'classification':\n",
    "                model = lgb.LGBMClassifier(n_estimators=100, learning_rate = 0.05, verbose = 1)\n",
    "\n",
    "            elif task == 'regression':\n",
    "                model = lgb.LGBMRegressor(n_estimators=100, learning_rate = 0.05, verbose = 1)\n",
    "\n",
    "            else:\n",
    "                raise ValueError('Task must be either \"classification\" or \"regression\"')\n",
    "                \n",
    "            # If training using early stopping need a validation set\n",
    "            if early_stopping:\n",
    "                \n",
    "                train_features, valid_features, train_labels, valid_labels = train_test_split(features, labels, test_size = 0.15)\n",
    "\n",
    "                # Train the model with early stopping\n",
    "                model.fit(train_features, train_labels, eval_metric = eval_metric,\n",
    "                          eval_set = [(valid_features, valid_labels)],\n",
    "                           verbose = -1)\n",
    "                \n",
    "                # Clean up memory\n",
    "                gc.enable()\n",
    "                del train_features, train_labels, valid_features, valid_labels\n",
    "                gc.collect()\n",
    "                \n",
    "            else:\n",
    "                model.fit(features, labels)\n",
    "\n",
    "            # Record the feature importances\n",
    "            feature_importance_values += model.feature_importances_ / n_iterations\n",
    "\n",
    "        feature_importances = pd.DataFrame({'feature': feature_names, 'importance': feature_importance_values})\n",
    "\n",
    "        # Sort features according to importance\n",
    "        feature_importances = feature_importances.sort_values('importance', ascending = False).reset_index(drop = True)\n",
    "\n",
    "        # Normalize the feature importances to add up to one\n",
    "        feature_importances['normalized_importance'] = feature_importances['importance'] / feature_importances['importance'].sum()\n",
    "        feature_importances['cumulative_importance'] = np.cumsum(feature_importances['normalized_importance'])\n",
    "        select_df = feature_importances[feature_importances['cumulative_importance']<=p_importance]\n",
    "        select_columns = select_df['feature']\n",
    "        self.lgbm_columns = list(select_columns.values)\n",
    "        res = data[self.columns]\n",
    "        return res\n",
    "        \n",
    "    def filter_select(self, data_x, data_y, k=None, p=50,method=f_classif):\n",
    "        columns = data_x.columns\n",
    "        if k != None:\n",
    "            model = SelectKBest(method,k)\n",
    "            res = model.fit_transform(data_x,data_y)\n",
    "            supports = model.get_support()\n",
    "        else:\n",
    "            model = SelectPercentile(method,p)\n",
    "            res = model.fit_transform(data_x,data_y)\n",
    "            supports = model.get_support()\n",
    "        self.filter_support_ = supports\n",
    "        self.filter_columns = columns[supports]\n",
    "        return res\n",
    "    \n",
    "    def wrapper_select(self,data_x,data_y,n,estimator):\n",
    "        columns = data_x.columns\n",
    "        model = RFE(estimator=estimator,n_features_to_select=n)\n",
    "        res = model.fit_transform(data_x,data_y)\n",
    "        supports = model.get_support() #标识被选择的特征在原数据中的位置\n",
    "        self.wrapper_supports = supports\n",
    "        self.wrapper_columns = columns[supports]\n",
    "        return res\n",
    "    \n",
    "    def embedded_select(self,data_x,data_y,estimator,threshold=None):\n",
    "        columns = data_x.columns\n",
    "        model = SelectFromModel(estimator=estimator,prefit=False,threshold=threshold)\n",
    "        res = model.fit_transform(data_x,data_y)\n",
    "        supports = model.get_support()\n",
    "        self.embedded_supports = supports\n",
    "        self.embedded_columns = columns[supports]\n",
    "        print(\"self.embedded_columns:\",self.embedded_columns)\n",
    "        return res\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [],
   "source": [
    "#调参时计算召回率和准确率\n",
    "def lstm_recall(prediction,y,n=1,thr=0.5):\n",
    "    len_p = len(prediction)\n",
    "    l = 0\n",
    "    z = 0\n",
    "    res = []\n",
    "    if n == 1:\n",
    "        for i in range(len_p):\n",
    "            if (prediction[i]>= thr):\n",
    "                l = l+1\n",
    "                if (y[i] ==1):\n",
    "                    z = z+1\n",
    "    elif n==0:\n",
    "         for i in range(len_p):\n",
    "            if (prediction[i]<=thr):\n",
    "                l = l+1\n",
    "                if (y[i] ==0):\n",
    "                    z = z+1\n",
    "    lstm_recall = z/l\n",
    "    return lstm_recall\n",
    "\n",
    "def lstm_accuracy(prediction,y,thr=0.5):\n",
    "    len_p = len(prediction)\n",
    "    l = 0\n",
    "    for i in range(len_p):\n",
    "        if ((prediction[i]>=thr) & (y[i] ==1)) |  ((prediction[i]<thr) & (y[i] ==0)):\n",
    "            l = l + 1\n",
    "            \n",
    "    accuracy = l/len_p\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [],
   "source": [
    "def res_output(res,buy_thr=1.5,sell_thr=1.1):\n",
    "    '''\n",
    "    基于lgbm和embedded两组特征选择数据的计算结果确定预测结果\n",
    "    buy_thr:预测股价上升的门限值，默认1.6,\n",
    "    sell_thr:预测股价下降的门限值，默认1.2\n",
    "    大于买入门限标记为1，小于卖出门限标记为-1，中间值认为买入卖出信号不强，选择观望或空仓，卖出信号可用于做空，在无法做空时认为空仓\n",
    "    \n",
    "    '''\n",
    "    length = len(res)\n",
    "    l = []\n",
    "    for i in range(length):\n",
    "        if res[i] > buy_thr:\n",
    "            l.append(1)\n",
    "        elif res[i] < sell_thr:\n",
    "            l.append(-1)\n",
    "        else:\n",
    "            l.append(0)\n",
    "    return l\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [],
   "source": [
    "def LSTM_fun_keras(n_input,train_x,train_y,predict_x,prediction_y,seq_len=5):\n",
    "    K.get_session().close()\n",
    "    K.set_session(tf.Session())\n",
    "    K.get_session().run(tf.global_variables_initializer())\n",
    "    INPUT_DIM = n_input\n",
    "    output_dim = 1\n",
    "    batch_size = 8 #每轮训练模型时，样本的数量\n",
    "    epochs = 100 #训练100轮次\n",
    "    hidden_size = 128\n",
    "    lstm_units = 64\n",
    "    inputs = Input(shape=(seq_len, INPUT_DIM))\n",
    "    #drop1 = Dropout(0.3)(inputs)\n",
    "    x = Conv1D(filters = 64, kernel_size = 1, activation = 'relu')(inputs)  #, padding = 'same'\n",
    "    #x = Conv1D(filters=128, kernel_size=5, activation='relu')(output1)#embedded_sequences\n",
    "    x = MaxPooling1D(pool_size = seq_len)(x)\n",
    "    #x = Dropout(0.1)(x)\n",
    "    #print(x.shape)\n",
    "    lstm_out = Bidirectional(LSTM(lstm_units, activation='relu'), name='bilstm')(x)\n",
    "    #lstm_out = LSTM(lstm_units,activation='relu')(x)\n",
    "    #print(lstm_out.shape)\n",
    "    # ATTENTION PART STARTS HERE\n",
    "    attention_probs = Dense(128, activation='sigmoid', name='attention_vec')(lstm_out)\n",
    "    #attention_mul=layers.merge([stm_out,attention_probs], output_shape],mode='concat',concat_axis=1))\n",
    "    attention_mul =Multiply()([lstm_out, attention_probs])\n",
    "    #attention_mul = merge([lstm_out, attention_probs],output_shape=32, name='attention_mul', mode='mul')\n",
    "    #h1 = Dense(hidden_size, activation='relu')(attention_mul)\n",
    "    output_class = Dense(1, activation='sigmoid')(attention_mul)\n",
    "    #output = Dense(10, activation='sigmoid')(drop2)\n",
    "\n",
    "    model_class = Model(inputs=inputs, outputs=output_class)\n",
    "    #print(model_class.summary())\n",
    "    model_class.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
    "    #model_class.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy'])\n",
    "    # simple early stopping\n",
    "    es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=3)\n",
    "    # fit model\n",
    "    history_class = model_class.fit(train_x, train_y,validation_split=0.3, epochs=epochs, batch_size=4, shuffle=False, callbacks=[es])\n",
    "    #history_class = model_class.fit(train_x, train_y, epochs=epochs, batch_size=1, shuffle=False)\n",
    "    y_pred_class = model_class.predict(predict_x)\n",
    "    print(\"accuracy:\",lstm_accuracy(y_pred_class,prediction_y,thr=0.5))\n",
    "    return y_pred_class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {},
   "outputs": [],
   "source": [
    "def LSTM_fun(n_input,train_x,train_y,predict_x,prediction_y,seq_len=5):\n",
    "    #LSTM\n",
    "    lr=0.003\n",
    "    lstm_size = 3  #lstm cell数量，基于数据量调整\n",
    "    epoch_num = 10  #打印次数，和n_batch相乘便是迭代次数\n",
    "    n_batch = 300\n",
    "    lookback = seq_len\n",
    "    tf.reset_default_graph()\n",
    "    \n",
    "    x = tf.placeholder(tf.float32,[None,lookback,n_input])\n",
    "    y = tf.placeholder(tf.float32,[None,1])\n",
    "\n",
    "    weights = tf.Variable(tf.truncated_normal([lstm_size,1],stddev=0.1))\n",
    "    biases = tf.Variable(tf.constant(0.1,shape=[1]))\n",
    "\n",
    "    def LSTM_net(x,weights,biases):\n",
    "        lstm_cell = tf.contrib.rnn.LSTMCell(lstm_size,name='basic_lstm_cell') #.BasicLSTMCell(lstm_size)\n",
    "        output,final_state = tf.nn.dynamic_rnn(lstm_cell,x,dtype=tf.float32)\n",
    "        results = tf.nn.sigmoid(tf.matmul(final_state[1],weights)+biases)\n",
    "        return results\n",
    "    prediction = LSTM_net(x,weights,biases)\n",
    "\n",
    "    loss = tf.reduce_mean(tf.square(y - prediction))\n",
    "    #train_step = tf.train.GradientDescentOptimizer(lr).minimize(loss)\n",
    "    train_step = tf.train.AdamOptimizer(lr).minimize(loss)\n",
    "\n",
    "    init = tf.global_variables_initializer()\n",
    "    with tf.Session() as sess:\n",
    "        sess.run(init)\n",
    "        for i in range(epoch_num):\n",
    "            for j in range(n_batch):\n",
    "                sess.run(train_step,feed_dict={x:train_x,y:train_y})\n",
    "                train_loss = sess.run(loss,feed_dict={x:train_x,y:train_y})\n",
    "            print('train loss is'+ str(train_loss))\n",
    "        prediction_res = sess.run(prediction,feed_dict={x:predict_x})\n",
    "    print(\"accuracy:\",lstm_accuracy(prediction_res,prediction_y,thr=0.5))\n",
    "    return prediction_res"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_test_time_list(start_date,test_start_date,test_end_date):\n",
    "    '''\n",
    "    使用机器学习算法计算时的时间数据\n",
    "    input:\n",
    "    start_date:取宏观数据的开始时间\n",
    "    test_start_date:预测的开始时间，也就是取宏观数据的截止时间\n",
    "    test_end_date:预测的截止时间，对期间的每一个月都要预测，每一个月都要重跑一遍预测函数，每个月的开始使用上个月28号的价格数据作为截止价格时间\n",
    "    output:\n",
    "    m_l：每一次预测时的月份列表，在此列表内跑预测函数，\n",
    "    start_date,取宏观数据和价格数据的开始时间，由全局变量定义\n",
    "    ed:取价格数据截止时间列表，顺序和m_l对应\n",
    "    '''\n",
    "    test_month = get_month_list(test_start_date,test_end_date)\n",
    "    m_l_pre = []\n",
    "    ed = []\n",
    "    for m in test_month:\n",
    "        ml = get_month_list(start_date,m)\n",
    "        m_l_pre.append(ml)\n",
    "        if m == test_month[-1]:\n",
    "            ed.append(test_end_date)\n",
    "        else:\n",
    "            ed.append(m+'-'+'28')\n",
    "    return m_l_pre,start_date,ed"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [],
   "source": [
    "ml_test,sd_test,ed_test = get_test_time_list(start_date,test_start_date,test_end_date)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {},
   "outputs": [],
   "source": [
    "def monthly_fun(month_list, start_date, end_date):\n",
    "    macro_data_o = get_macro_data(month_list,start_date, end_date)\n",
    "    res = macro_data_o[0]\n",
    "    res_a = macro_data_o[1]\n",
    "    price = macro_data_o[2]\n",
    "    price_month = get_price_month_data(price)\n",
    "    res.index = res['stat_month']\n",
    "    res_a.index = res['stat_month']\n",
    "\n",
    "    sel_data = pd.merge(res_a, price_month, left_index=True, right_index=True).dropna()  # 使用全部宏观数据\n",
    "    data_pure = get_pure_values(sel_data)\n",
    "    columns = data_pure.columns\n",
    "    data_x_start = data_pure[columns[:-1]]\n",
    "    data_y_o = data_pure[columns[-1]]\n",
    "    data_x_o = winsorize_and_standarlize(data_x_start)\n",
    "    data_y_class_o = get_profit_class(data_y_o)\n",
    "    data_x, data_y_class = get_final_data(data_x_o, data_y_class_o)\n",
    "    _, data_y = get_final_data(data_x_o, data_y_o)\n",
    "    # 特征选择\n",
    "    #print(\"特征选择\")\n",
    "    f = FeatureSelection()\n",
    "    #print(\"去除一些共线性特征\")\n",
    "    n_collinear = f.identify_collinear(data_x, correlation_threshold=0.9) #去除一些共线性特征\n",
    "    #print(\"lightgbm 重要特征\")\n",
    "    lgbm_res = f.identify_importance_lgbm(n_collinear, data_y_class, p_importance=0.9)\n",
    "\n",
    "    #estimator = LinearSVC()\n",
    "    #wrapper_res = f.wrapper_select(data_x=n_collinear, data_y=data_y_class, n=5, estimator=estimator)\n",
    "\n",
    "    #est = LinearSVC(C=0.01, penalty='l1', dual=False)\n",
    "    #print(\"random forest 重要特征\")\n",
    "    est1 = RandomForestClassifier(verbose=1)\n",
    "    embedded_res = f.embedded_select(data_x=n_collinear, data_y=data_y_class, estimator=est1)\n",
    "    # LSTM数据准备\n",
    "    #print(\"数据准备\")\n",
    "    lgbm_n_input = len(lgbm_res.columns)\n",
    "    print(\"lgbm_res.columns:\",lgbm_res.columns)\n",
    "    lgbm_x_a = np.array(lgbm_res)\n",
    "    lgbm_x_o = [lgbm_x_a[i: i + seq_len, :] for i in range(lgbm_res.shape[0] - seq_len)]\n",
    "    lgbm_x_l = len(lgbm_x_o)\n",
    "    lgbm_x_array = np.reshape(lgbm_x_o, [lgbm_x_l, seq_len, lgbm_n_input])\n",
    "    lgbm_x = lgbm_x_array[:-next_n]\n",
    "    lgbm_x_prediction = lgbm_x_array[-next_n:]\n",
    "    lgbm_y_o = np.array([data_y_class[i + seq_len] for i in range(len(data_y_class) - seq_len)])\n",
    "    lgbm_y_array = np.reshape(lgbm_y_o, [lgbm_y_o.shape[0], 1])\n",
    "    lgbm_y = lgbm_y_array[:-next_n]\n",
    "    lgbm_y_prediction = lgbm_y_array[-next_n:]\n",
    "    # print(len(lgbm_y))\n",
    "\n",
    "    embedded_n_input = np.shape(embedded_res)[1]\n",
    "    embedded_x_a = np.array(embedded_res)\n",
    "    embedded_x_o = [embedded_x_a[i: i + seq_len, :] for i in range(embedded_res.shape[0] - seq_len)]\n",
    "    embedded_x_l = len(embedded_x_o)\n",
    "    embedded_x_array = np.reshape(embedded_x_o, [embedded_x_l, seq_len, embedded_n_input])\n",
    "    embedded_x = embedded_x_array[:-next_n]\n",
    "    embedded_x_predition = embedded_x_array[-next_n:]\n",
    "    embedded_y_o = np.array([data_y_class[i + seq_len] for i in range(len(data_y_class) - seq_len)])\n",
    "    embedded_y_array = np.reshape(embedded_y_o, [embedded_y_o.shape[0], 1])\n",
    "    embedded_y = embedded_y_array[:-next_n]\n",
    "\n",
    "    # 获取训练数据和测试数据\n",
    "    # lgbm_train_x,lgbm_test_x,lgbm_train_y,lgbm_test_y = train_test_split(lgbm_x,lgbm_y,test_size=0.3,random_state=0)\n",
    "    # embedded_train_x,embedded_test_x,embedded_train_y,embedded_test_y = train_test_split(embedded_x,embedded_y,test_size=0.3,random_state=0)\n",
    "    #print(\"lightgbm 特征训练lstm\")\n",
    "    lgbm_pre_res = LSTM_fun(lgbm_n_input, lgbm_x, lgbm_y, lgbm_x_prediction, lgbm_y_prediction,seq_len=seq_len)\n",
    "    print(\"lgbm_pre_res: \",lgbm_pre_res)\n",
    "    #print(\"random forest 特征训练lstm\")\n",
    "    embedded_pre_res = LSTM_fun(embedded_n_input, embedded_x, embedded_y, embedded_x_predition, lgbm_y_prediction,seq_len=seq_len)\n",
    "    print(\"embedded_pre_res: \",embedded_pre_res)\n",
    "    # print(lgbm_pre_res)\n",
    "    # print(embedded_pre_res)\n",
    "    pre_res = lgbm_pre_res + embedded_pre_res  # 将两组数据的的预测结果相加\n",
    "    #signal = res_output(pre_res)\n",
    "    # print(signal)\n",
    "    print(\"predict result:\", pre_res)\n",
    "    return pre_res"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_pre_signal(ml,sd,ed):\n",
    "    '''\n",
    "    在时间序列下计算最后三个月的预测值，以此作为决策信号\n",
    "    '''\n",
    "    start_clock = time.clock()\n",
    "    length = len(ml)\n",
    "    l = []\n",
    "    for i in range(length):\n",
    "        month_l = ml[i]\n",
    "        end_d = ed[i]\n",
    "        print(\"predict month:\",end_d)\n",
    "        pre = monthly_fun(month_l,sd,end_d)\n",
    "        l.append(pre)\n",
    "    end_clock = time.clock()\n",
    "    clofk_diff = (end_clock - start_clock)/60\n",
    "    print('time cost:%0.3f'%clofk_diff)\n",
    "    return l\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "predict month: 2018-06-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['retail_sin', 'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx',\n",
      "       'lagging_idx', 'growth_yoy', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'finished_product_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_tax_value_acc', 'main_business_tax_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc',\n",
      "       'enterprise_total_loss_ratio_acc', 'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.053699784\n",
      "train loss is0.026350262\n",
      "train loss is0.022109997\n",
      "train loss is0.020505724\n",
      "train loss is0.017385125\n",
      "train loss is0.016590606\n",
      "train loss is0.017148232\n",
      "train loss is0.016689152\n",
      "train loss is0.016515447\n",
      "train loss is0.016337749\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.02466314]\n",
      " [0.02583992]\n",
      " [0.03144232]]\n",
      "train loss is0.084348135\n",
      "train loss is0.056791104\n",
      "train loss is0.039271243\n",
      "train loss is0.030451551\n",
      "train loss is0.025075346\n",
      "train loss is0.022343049\n",
      "train loss is0.02099851\n",
      "train loss is0.01986318\n",
      "train loss is0.018664889\n",
      "train loss is0.017743504\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.07175595]\n",
      " [0.073226  ]\n",
      " [0.06381515]]\n",
      "predict result: [[0.09641909]\n",
      " [0.09906593]\n",
      " [0.09525748]]\n",
      "predict month: 2018-07-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['invest_yoy', 'primary_yoy', 'centre_project_yoy', 'num_acc_yoy',\n",
      "       'lagging_idx', 'growth_yoy', 'loss_enterprise_ratio_acc_diff',\n",
      "       'total_interest_ratio_acc_diff', 'id', 'enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'main_business_tax_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_tax_value_acc', 'main_business_tax_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc',\n",
      "       'enterprise_total_loss_ratio_acc', 'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.062132247\n",
      "train loss is0.024475943\n",
      "train loss is0.007952113\n",
      "train loss is0.0028315885\n",
      "train loss is0.0018602336\n",
      "train loss is0.0014030348\n",
      "train loss is0.001101673\n",
      "train loss is0.00088516786\n",
      "train loss is0.0007219809\n",
      "train loss is0.00059496635\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.01631733]\n",
      " [0.02419191]\n",
      " [0.04337828]]\n",
      "train loss is0.07662774\n",
      "train loss is0.035125215\n",
      "train loss is0.02611381\n",
      "train loss is0.02313683\n",
      "train loss is0.020876443\n",
      "train loss is0.01841032\n",
      "train loss is0.015435463\n",
      "train loss is0.013420463\n",
      "train loss is0.011827211\n",
      "train loss is0.010580279\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.01726584]\n",
      " [0.02192607]\n",
      " [0.05739613]]\n",
      "predict result: [[0.03358317]\n",
      " [0.04611798]\n",
      " [0.10077441]]\n",
      "predict month: 2018-08-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['invest', 'invest_yoy', 'centre_project_yoy', 'num_acc_yoy',\n",
      "       'lagging_idx', 'growth_yoy', 'enterprise_value_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_tax_value_acc', 'main_business_tax_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc',\n",
      "       'enterprise_total_loss_ratio_acc', 'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.05702769\n",
      "train loss is0.022893026\n",
      "train loss is0.013786929\n",
      "train loss is0.010574535\n",
      "train loss is0.0083441585\n",
      "train loss is0.006657049\n",
      "train loss is0.005352853\n",
      "train loss is0.0043489016\n",
      "train loss is0.0035784787\n",
      "train loss is0.0029823293\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.06710275]\n",
      " [0.06864689]\n",
      " [0.13399144]]\n",
      "train loss is0.06865379\n",
      "train loss is0.045321755\n",
      "train loss is0.0334653\n",
      "train loss is0.023498373\n",
      "train loss is0.017134277\n",
      "train loss is0.014832301\n",
      "train loss is0.013489431\n",
      "train loss is0.012595303\n",
      "train loss is0.0119191855\n",
      "train loss is0.011299687\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.02326428]\n",
      " [0.2608238 ]\n",
      " [0.2779691 ]]\n",
      "predict result: [[0.09036702]\n",
      " [0.32947066]\n",
      " [0.41196054]]\n",
      "predict month: 2018-09-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['invest_yoy', 'primary_yoy', 'centre_project_yoy', 'early_warning_idx',\n",
      "       'lagging_idx', 'growth_yoy', 'loss_enterprise_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'enterprise_total_loss_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_tax_value_acc', 'main_business_tax_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc',\n",
      "       'enterprise_total_loss_ratio_acc', 'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.04723048\n",
      "train loss is0.018808533\n",
      "train loss is0.012115259\n",
      "train loss is0.013618455\n",
      "train loss is0.010928354\n",
      "train loss is0.00983716\n",
      "train loss is0.03170388\n",
      "train loss is0.028128173\n",
      "train loss is0.027211118\n",
      "train loss is0.02580324\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.01408006]\n",
      " [0.01876594]\n",
      " [0.04228292]]\n",
      "train loss is0.07227864\n",
      "train loss is0.041863155\n",
      "train loss is0.035183497\n",
      "train loss is0.03230825\n",
      "train loss is0.022168176\n",
      "train loss is0.017364109\n",
      "train loss is0.015363429\n",
      "train loss is0.014548379\n",
      "train loss is0.014108387\n",
      "train loss is0.013825331\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.0121333 ]\n",
      " [0.01149488]\n",
      " [0.01357963]]\n",
      "predict result: [[0.02621336]\n",
      " [0.03026082]\n",
      " [0.05586255]]\n",
      "predict month: 2018-10-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['retail_sin_yoy', 'centre_project_yoy', 'lagging_idx', 'growth_yoy',\n",
      "       'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'total_interest_ratio_acc_diff', 'id', 'enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_tax_value_acc', 'financial_expense_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_tax_value_acc', 'main_business_tax_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc',\n",
      "       'enterprise_total_loss_ratio_acc', 'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.05212594\n",
      "train loss is0.026083311\n",
      "train loss is0.01880986\n",
      "train loss is0.014879925\n",
      "train loss is0.007173608\n",
      "train loss is0.005373628\n",
      "train loss is0.0018070565\n",
      "train loss is0.0009347013\n",
      "train loss is0.0006465211\n",
      "train loss is0.00048266177\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.01906512]\n",
      " [0.01940905]\n",
      " [0.01928007]]\n",
      "train loss is0.059867784\n",
      "train loss is0.040318258\n",
      "train loss is0.03117141\n",
      "train loss is0.027376382\n",
      "train loss is0.02550655\n",
      "train loss is0.024332339\n",
      "train loss is0.023731748\n",
      "train loss is0.023359114\n",
      "train loss is0.023130529\n",
      "train loss is0.022972312\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.01763594]\n",
      " [0.01753548]\n",
      " [0.01757548]]\n",
      "predict result: [[0.03670105]\n",
      " [0.03694453]\n",
      " [0.03685555]]\n",
      "predict month: 2018-11-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['retail_sin', 'invest', 'primary_yoy', 'centre_project_yoy',\n",
      "       'early_warning_idx', 'lagging_idx', 'growth_yoy',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'loss_enterprise_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'enterprise_total_loss_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_tax_value_acc', 'main_business_tax_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc',\n",
      "       'enterprise_total_loss_ratio_acc', 'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.04834\n",
      "train loss is0.009293878\n",
      "train loss is0.004280874\n",
      "train loss is0.0024381944\n",
      "train loss is0.0016235012\n",
      "train loss is0.0011515431\n",
      "train loss is0.00080492784\n",
      "train loss is0.00060780003\n",
      "train loss is0.00046963478\n",
      "train loss is0.000369464\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.02531897]\n",
      " [0.0323811 ]\n",
      " [0.02841723]]\n",
      "train loss is0.07863983\n",
      "train loss is0.020117832\n",
      "train loss is0.020228716\n",
      "train loss is0.011676148\n",
      "train loss is0.0049999347\n",
      "train loss is0.0033574242\n",
      "train loss is0.0024427867\n",
      "train loss is0.0018333255\n",
      "train loss is0.0014122659\n",
      "train loss is0.001106695\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.01263714]\n",
      " [0.01163571]\n",
      " [0.01180808]]\n",
      "predict result: [[0.03795611]\n",
      " [0.04401681]\n",
      " [0.04022532]]\n",
      "predict month: 2018-12-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['retail_sin_yoy', 'invest_yoy', 'num_acc_yoy', 'growth_yoy',\n",
      "       'total_interest_ratio_acc_diff', 'id', 'enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'total_interest_ratio_acc',\n",
      "       'enterprise_total_loss_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_tax_value_acc', 'main_business_tax_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc',\n",
      "       'enterprise_total_loss_ratio_acc', 'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.05652823\n",
      "train loss is0.023307336\n",
      "train loss is0.010966744\n",
      "train loss is0.006509932\n",
      "train loss is0.0047713555\n",
      "train loss is0.0037438106\n",
      "train loss is0.0030466418\n",
      "train loss is0.0025366081\n",
      "train loss is0.0021439283\n",
      "train loss is0.0018074405\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.01628074]\n",
      " [0.01975732]\n",
      " [0.0202125 ]]\n",
      "train loss is0.08456098\n",
      "train loss is0.06395899\n",
      "train loss is0.04874135\n",
      "train loss is0.041518852\n",
      "train loss is0.037666745\n",
      "train loss is0.035613116\n",
      "train loss is0.033875108\n",
      "train loss is0.03300443\n",
      "train loss is0.032342236\n",
      "train loss is0.035929065\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.04025534]\n",
      " [0.04035263]\n",
      " [0.04659217]]\n",
      "predict result: [[0.05653607]\n",
      " [0.06010996]\n",
      " [0.06680467]]\n",
      "predict month: 2019-01-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['invest_yoy', 'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx',\n",
      "       'lagging_idx', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_ratio_acc',\n",
      "       'total_interest_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_tax_value_acc', 'main_business_tax_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc',\n",
      "       'enterprise_total_loss_ratio_acc', 'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.044906903\n",
      "train loss is0.019793404\n",
      "train loss is0.011748209\n",
      "train loss is0.0014905202\n",
      "train loss is0.0009169426\n",
      "train loss is0.000623052\n",
      "train loss is0.0004484218\n",
      "train loss is0.0003082457\n",
      "train loss is0.00022425689\n",
      "train loss is0.00017571633\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.01986743]\n",
      " [0.02878789]\n",
      " [0.0309437 ]]\n",
      "train loss is0.07932298\n",
      "train loss is0.054346878\n",
      "train loss is0.041173555\n",
      "train loss is0.028328989\n",
      "train loss is0.020054435\n",
      "train loss is0.013983429\n",
      "train loss is0.01077773\n",
      "train loss is0.009465574\n",
      "train loss is0.008816552\n",
      "train loss is0.008359575\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.00839445]\n",
      " [0.00843957]\n",
      " [0.00859048]]\n",
      "predict result: [[0.02826187]\n",
      " [0.03722746]\n",
      " [0.03953418]]\n",
      "predict month: 2019-02-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'early_warning_idx', 'lagging_idx', 'growth_yoy',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'enterprise_total_loss_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_tax_value_acc', 'main_business_tax_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc',\n",
      "       'enterprise_total_loss_ratio_acc', 'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.054372057\n",
      "train loss is0.03139143\n",
      "train loss is0.027507847\n",
      "train loss is0.012552945\n",
      "train loss is0.010504204\n",
      "train loss is0.0032341103\n",
      "train loss is0.00086412\n",
      "train loss is0.00057043345\n",
      "train loss is0.0004337755\n",
      "train loss is0.00024409375\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.9446633 ]\n",
      " [0.9455726 ]\n",
      " [0.94430393]]\n",
      "train loss is0.079954214\n",
      "train loss is0.04024484\n",
      "train loss is0.02369681\n",
      "train loss is0.013400483\n",
      "train loss is0.005970549\n",
      "train loss is0.0044177654\n",
      "train loss is0.0035099052\n",
      "train loss is0.0028714666\n",
      "train loss is0.002385127\n",
      "train loss is0.00199854\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.7921576 ]\n",
      " [0.79674774]\n",
      " [0.71190614]]\n",
      "predict result: [[1.7368209]\n",
      " [1.7423203]\n",
      " [1.6562101]]\n",
      "predict month: 2019-03-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['retail_sin_yoy', 'invest_yoy', 'primary_yoy', 'centre_project_yoy',\n",
      "       'early_warning_idx', 'lagging_idx', 'pmi', 'enterprise_value_acc_diff',\n",
      "       'total_interest_ratio_acc_diff', 'id', 'enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'finished_product_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_tax_value_acc', 'main_business_tax_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc',\n",
      "       'enterprise_total_loss_ratio_acc', 'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.056399476\n",
      "train loss is0.031234764\n",
      "train loss is0.015158131\n",
      "train loss is0.009977797\n",
      "train loss is0.003043532\n",
      "train loss is0.0019650154\n",
      "train loss is0.0014506582\n",
      "train loss is0.0011239022\n",
      "train loss is0.0008966178\n",
      "train loss is0.000729788\n",
      "accuracy: 0.6666666666666666\n",
      "lgbm_pre_res:  [[0.904074 ]\n",
      " [0.9040969]\n",
      " [0.2796123]]\n",
      "train loss is0.06320082\n",
      "train loss is0.039954156\n",
      "train loss is0.033333026\n",
      "train loss is0.027295312\n",
      "train loss is0.020334497\n",
      "train loss is0.017075142\n",
      "train loss is0.015059474\n",
      "train loss is0.009949407\n",
      "train loss is0.005847223\n",
      "train loss is0.0042039733\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.88717645]\n",
      " [0.8815112 ]\n",
      " [0.8632739 ]]\n",
      "predict result: [[1.7912505]\n",
      " [1.785608 ]\n",
      " [1.1428862]]\n",
      "predict month: 2019-04-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['retail_sin', 'invest', 'invest_yoy', 'centre_project_yoy',\n",
      "       'num_acc_yoy', 'early_warning_idx', 'lagging_idx', 'growth_yoy',\n",
      "       'total_interest_ratio_acc_diff', 'loss_enterprise_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_tax_value_acc', 'main_business_tax_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc',\n",
      "       'enterprise_total_loss_ratio_acc', 'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.05425264\n",
      "train loss is0.028535107\n",
      "train loss is0.015837466\n",
      "train loss is0.011686353\n",
      "train loss is0.009327799\n",
      "train loss is0.008194791\n",
      "train loss is0.006356205\n",
      "train loss is0.0010812953\n",
      "train loss is0.00079344504\n",
      "train loss is0.0006427126\n",
      "accuracy: 0.6666666666666666\n",
      "lgbm_pre_res:  [[0.9076699 ]\n",
      " [0.39078653]\n",
      " [0.87671465]]\n",
      "train loss is0.062517144\n",
      "train loss is0.030617785\n",
      "train loss is0.017629322\n",
      "train loss is0.011981995\n",
      "train loss is0.010140124\n",
      "train loss is0.0034769273\n",
      "train loss is0.05979773\n",
      "train loss is0.059352744\n",
      "train loss is0.05905969\n",
      "train loss is0.058805473\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.9185535 ]\n",
      " [0.9669885 ]\n",
      " [0.99908817]]\n",
      "predict result: [[1.8262234]\n",
      " [1.357775 ]\n",
      " [1.8758028]]\n",
      "predict month: 2019-05-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['invest_yoy', 'centre_project_yoy', 'num_acc_yoy', 'lagging_idx',\n",
      "       'growth_yoy', 'total_interest_ratio_acc_diff', 'enterprise_value_acc',\n",
      "       'loss_enterprise_value_acc', 'finished_product_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'accounts_receivable_value_acc',\n",
      "       'finished_product_ratio_acc', 'main_business_tax_value_acc',\n",
      "       'main_business_tax_ratio_acc', 'financial_expense_ratio_acc',\n",
      "       'total_interest_ratio_acc', 'enterprise_total_loss_ratio_acc',\n",
      "       'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.05989391\n",
      "train loss is0.01654623\n",
      "train loss is0.008429553\n",
      "train loss is0.005762052\n",
      "train loss is0.0043509905\n",
      "train loss is0.00346838\n",
      "train loss is0.0025216267\n",
      "train loss is0.0009727656\n",
      "train loss is0.00053649454\n",
      "train loss is0.00037603563\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.9789656 ]\n",
      " [0.97547024]\n",
      " [0.9531046 ]]\n",
      "train loss is0.074989304\n",
      "train loss is0.04392808\n",
      "train loss is0.033781163\n",
      "train loss is0.024287665\n",
      "train loss is0.022400478\n",
      "train loss is0.021216135\n",
      "train loss is0.020378206\n",
      "train loss is0.01830684\n",
      "train loss is0.01261705\n",
      "train loss is0.0075968853\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.99379104]\n",
      " [0.9741165 ]\n",
      " [0.9214013 ]]\n",
      "predict result: [[1.9727566]\n",
      " [1.9495867]\n",
      " [1.874506 ]]\n",
      "predict month: 2019-06-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['retail_sin', 'invest', 'num_acc_yoy', 'lagging_idx',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff',\n",
      "       'enterprise_value_acc', 'loss_enterprise_ratio_acc',\n",
      "       'main_business_tax_value_acc', 'financial_expense_ratio_acc',\n",
      "       'total_interest_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'accounts_receivable_value_acc',\n",
      "       'finished_product_ratio_acc', 'main_business_tax_value_acc',\n",
      "       'main_business_tax_ratio_acc', 'financial_expense_ratio_acc',\n",
      "       'total_interest_ratio_acc', 'enterprise_total_loss_ratio_acc',\n",
      "       'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.057722554\n",
      "train loss is0.030322827\n",
      "train loss is0.023247395\n",
      "train loss is0.017207168\n",
      "train loss is0.01404751\n",
      "train loss is0.011354836\n",
      "train loss is0.009916357\n",
      "train loss is0.007524872\n",
      "train loss is0.0024533737\n",
      "train loss is0.0018836578\n",
      "accuracy: 0.3333333333333333\n",
      "lgbm_pre_res:  [[0.19796054]\n",
      " [0.6686974 ]\n",
      " [0.74928206]]\n",
      "train loss is0.06803074\n",
      "train loss is0.02377231\n",
      "train loss is0.008528101\n",
      "train loss is0.0046944655\n",
      "train loss is0.0031573914\n",
      "train loss is0.0022817662\n",
      "train loss is0.0017078031\n",
      "train loss is0.001311463\n",
      "train loss is0.0009784874\n",
      "train loss is0.0006420702\n",
      "accuracy: 0.3333333333333333\n",
      "embedded_pre_res:  [[0.9278088 ]\n",
      " [0.49288988]\n",
      " [0.7532228 ]]\n",
      "predict result: [[1.1257694]\n",
      " [1.1615872]\n",
      " [1.5025048]]\n",
      "predict month: 2019-07-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['retail_sin', 'invest_yoy', 'centre_project_yoy', 'num_acc_yoy',\n",
      "       'lagging_idx', 'loss_enterprise_ratio_acc_diff',\n",
      "       'total_interest_ratio_acc_diff', 'id', 'enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'accounts_receivable_value_acc',\n",
      "       'finished_product_ratio_acc', 'main_business_tax_value_acc',\n",
      "       'total_interest_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'accounts_receivable_value_acc',\n",
      "       'finished_product_ratio_acc', 'main_business_tax_value_acc',\n",
      "       'main_business_tax_ratio_acc', 'financial_expense_ratio_acc',\n",
      "       'total_interest_ratio_acc', 'enterprise_total_loss_ratio_acc',\n",
      "       'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.06474923\n",
      "train loss is0.03928379\n",
      "train loss is0.030841297\n",
      "train loss is0.026684996\n",
      "train loss is0.019540621\n",
      "train loss is0.016094616\n",
      "train loss is0.014260686\n",
      "train loss is0.012703875\n",
      "train loss is0.011432084\n",
      "train loss is0.010283788\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.02090725]\n",
      " [0.02740168]\n",
      " [0.2753003 ]]\n",
      "train loss is0.08589686\n",
      "train loss is0.05081841\n",
      "train loss is0.027259713\n",
      "train loss is0.01945875\n",
      "train loss is0.015869237\n",
      "train loss is0.010765872\n",
      "train loss is0.008898307\n",
      "train loss is0.008209173\n",
      "train loss is0.007811622\n",
      "train loss is0.0075398744\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.02195959]\n",
      " [0.01081391]\n",
      " [0.01554627]]\n",
      "predict result: [[0.04286684]\n",
      " [0.03821559]\n",
      " [0.29084656]]\n",
      "predict month: 2019-08-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['invest_yoy', 'centre_project_yoy', 'num_acc_yoy', 'lagging_idx',\n",
      "       'growth_yoy', 'total_interest_ratio_acc_diff', 'enterprise_value_acc',\n",
      "       'loss_enterprise_value_acc', 'loss_enterprise_ratio_acc',\n",
      "       'financial_expense_ratio_acc', 'total_interest_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'accounts_receivable_value_acc',\n",
      "       'accounts_receivable_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_value_acc', 'main_business_tax_value_acc',\n",
      "       'main_business_tax_ratio_acc', 'financial_expense_ratio_acc',\n",
      "       'total_interest_ratio_acc', 'enterprise_total_loss_ratio_acc',\n",
      "       'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.06741729\n",
      "train loss is0.033442385\n",
      "train loss is0.019195668\n",
      "train loss is0.01031473\n",
      "train loss is0.006328269\n",
      "train loss is0.003710022\n",
      "train loss is0.0029709965\n",
      "train loss is0.0024282853\n",
      "train loss is0.002009356\n",
      "train loss is0.0016770802\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.9443093 ]\n",
      " [0.93683344]\n",
      " [0.94991595]]\n",
      "train loss is0.11377343\n",
      "train loss is0.054955468\n",
      "train loss is0.027151413\n",
      "train loss is0.016376417\n",
      "train loss is0.012711484\n",
      "train loss is0.010693564\n",
      "train loss is0.009642437\n",
      "train loss is0.008926624\n",
      "train loss is0.005133649\n",
      "train loss is0.00336632\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.73408264]\n",
      " [0.58786565]\n",
      " [0.9928433 ]]\n",
      "predict result: [[1.6783919]\n",
      " [1.5246991]\n",
      " [1.9427593]]\n",
      "predict month: 2019-09-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'centre_project_yoy',\n",
      "       'num_acc_yoy', 'lagging_idx', 'pmi', 'total_interest_ratio_acc_diff',\n",
      "       'enterprise_value_acc', 'loss_enterprise_ratio_acc',\n",
      "       'finished_product_ratio_acc', 'main_business_value_acc',\n",
      "       'total_interest_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'accounts_receivable_value_acc',\n",
      "       'accounts_receivable_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_value_acc', 'main_business_tax_value_acc',\n",
      "       'main_business_tax_ratio_acc', 'financial_expense_ratio_acc',\n",
      "       'total_interest_ratio_acc', 'enterprise_total_loss_ratio_acc',\n",
      "       'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.043292053\n",
      "train loss is0.009076192\n",
      "train loss is0.0045281374\n",
      "train loss is0.0028355017\n",
      "train loss is0.0016849224\n",
      "train loss is0.0012150722\n",
      "train loss is0.0009126633\n",
      "train loss is0.0006858757\n",
      "train loss is0.00053408364\n",
      "train loss is0.00042526575\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.98027086]\n",
      " [0.97869146]\n",
      " [0.97494894]]\n",
      "train loss is0.09038539\n",
      "train loss is0.03243243\n",
      "train loss is0.014988009\n",
      "train loss is0.008198768\n",
      "train loss is0.0056439037\n",
      "train loss is0.004223977\n",
      "train loss is0.003322466\n",
      "train loss is0.0026101368\n",
      "train loss is0.03856168\n",
      "train loss is0.036564775\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.9686148 ]\n",
      " [0.9350189 ]\n",
      " [0.92836654]]\n",
      "predict result: [[1.9488857]\n",
      " [1.9137104]\n",
      " [1.9033155]]\n",
      "predict month: 2019-10-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['retail_sin', 'invest', 'num_acc_yoy', 'lagging_idx', 'pmi',\n",
      "       'enterprise_value_acc', 'loss_enterprise_ratio_acc',\n",
      "       'finished_product_ratio_acc', 'main_business_tax_value_acc',\n",
      "       'main_business_tax_ratio_acc', 'financial_expense_ratio_acc',\n",
      "       'total_interest_ratio_acc', 'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'accounts_receivable_value_acc',\n",
      "       'accounts_receivable_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_value_acc', 'main_business_tax_value_acc',\n",
      "       'main_business_tax_ratio_acc', 'financial_expense_ratio_acc',\n",
      "       'total_interest_ratio_acc', 'enterprise_total_loss_ratio_acc',\n",
      "       'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.04509706\n",
      "train loss is0.015465673\n",
      "train loss is0.0119901905\n",
      "train loss is0.010618977\n",
      "train loss is0.009899791\n",
      "train loss is0.009461421\n",
      "train loss is0.009167932\n",
      "train loss is0.008957878\n",
      "train loss is0.008794891\n",
      "train loss is0.007621388\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.99144894]\n",
      " [0.99284726]\n",
      " [0.9903474 ]]\n",
      "train loss is0.068470016\n",
      "train loss is0.032159034\n",
      "train loss is0.017737359\n",
      "train loss is0.013453126\n",
      "train loss is0.0076303463\n",
      "train loss is0.0043715555\n",
      "train loss is0.0028901328\n",
      "train loss is0.0021010188\n",
      "train loss is0.0016279697\n",
      "train loss is0.0013131043\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.98852545]\n",
      " [0.98851764]\n",
      " [0.98842853]]\n",
      "predict result: [[1.9799744]\n",
      " [1.981365 ]\n",
      " [1.978776 ]]\n",
      "predict month: 2019-11-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['invest_yoy', 'centre_project_yoy', 'pmi', 'growth_yoy',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_ratio_acc',\n",
      "       'main_business_tax_value_acc', 'financial_expense_ratio_acc',\n",
      "       'total_interest_ratio_acc', 'enterprise_total_loss_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'accounts_receivable_value_acc',\n",
      "       'accounts_receivable_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_value_acc', 'main_business_tax_value_acc',\n",
      "       'main_business_tax_ratio_acc', 'financial_expense_ratio_acc',\n",
      "       'total_interest_ratio_acc', 'enterprise_total_loss_ratio_acc',\n",
      "       'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.04887066\n",
      "train loss is0.018465035\n",
      "train loss is0.010912376\n",
      "train loss is0.008786226\n",
      "train loss is0.00770807\n",
      "train loss is0.0071852924\n",
      "train loss is0.006888215\n",
      "train loss is0.0066972044\n",
      "train loss is0.0065654777\n",
      "train loss is0.0064703324\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.9671337]\n",
      " [0.9841499]\n",
      " [0.9671596]]\n",
      "train loss is0.07103871\n",
      "train loss is0.035486985\n",
      "train loss is0.026269253\n",
      "train loss is0.02221597\n",
      "train loss is0.019954843\n",
      "train loss is0.015084931\n",
      "train loss is0.012367724\n",
      "train loss is0.011263313\n",
      "train loss is0.010633502\n",
      "train loss is0.010178616\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.976572  ]\n",
      " [0.97582906]\n",
      " [0.9806342 ]]\n",
      "predict result: [[1.9437057]\n",
      " [1.9599789]\n",
      " [1.9477938]]\n",
      "predict month: 2019-12-28\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done  10 out of  10 | elapsed:    0.0s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "self.embedded_columns: Index(['invest_yoy', 'primary_yoy', 'centre_project_yoy', 'num_acc_yoy',\n",
      "       'lagging_idx', 'pmi', 'growth_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'id', 'enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'financial_expense_ratio_acc',\n",
      "       'total_interest_ratio_acc'],\n",
      "      dtype='object')\n",
      "lgbm_res.columns: Index(['retail_sin', 'retail_sin_yoy', 'invest', 'invest_yoy', 'primary_yoy',\n",
      "       'centre_project_yoy', 'num_acc_yoy', 'early_warning_idx', 'lagging_idx',\n",
      "       'pmi', 'growth_yoy', 'growth_acc_diff', 'enterprise_value_acc_diff',\n",
      "       'loss_enterprise_ratio_acc_diff', 'total_interest_ratio_acc_diff', 'id',\n",
      "       'enterprise_value_acc', 'loss_enterprise_value_acc',\n",
      "       'loss_enterprise_ratio_acc', 'accounts_receivable_value_acc',\n",
      "       'accounts_receivable_ratio_acc', 'finished_product_ratio_acc',\n",
      "       'main_business_value_acc', 'main_business_tax_value_acc',\n",
      "       'main_business_tax_ratio_acc', 'financial_expense_ratio_acc',\n",
      "       'total_interest_ratio_acc', 'enterprise_total_loss_ratio_acc',\n",
      "       'vat_ratio_acc'],\n",
      "      dtype='object')\n",
      "train loss is0.05258854\n",
      "train loss is0.023721639\n",
      "train loss is0.017555272\n",
      "train loss is0.015019054\n",
      "train loss is0.012499921\n",
      "train loss is0.015263297\n",
      "train loss is0.01222922\n",
      "train loss is0.0057867845\n",
      "train loss is0.0038774451\n",
      "train loss is0.0030446649\n",
      "accuracy: 1.0\n",
      "lgbm_pre_res:  [[0.9917373 ]\n",
      " [0.99120295]\n",
      " [0.99310875]]\n",
      "train loss is0.073921226\n",
      "train loss is0.046589762\n",
      "train loss is0.03760799\n",
      "train loss is0.030722683\n",
      "train loss is0.02332917\n",
      "train loss is0.01740158\n",
      "train loss is0.01610861\n",
      "train loss is0.015417381\n",
      "train loss is0.014936577\n",
      "train loss is0.014554764\n",
      "accuracy: 1.0\n",
      "embedded_pre_res:  [[0.98951626]\n",
      " [0.97272664]\n",
      " [0.98849666]]\n",
      "predict result: [[1.9812536]\n",
      " [1.9639297]\n",
      " [1.9816054]]\n",
      "time cost:11.716\n"
     ]
    }
   ],
   "source": [
    "pre_res_l = get_pre_signal(ml_test,sd_test,ed_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[-1, -1, -1],\n",
       " [-1, -1, -1],\n",
       " [-1, -1, -1],\n",
       " [-1, -1, -1],\n",
       " [-1, -1, -1],\n",
       " [-1, -1, -1],\n",
       " [-1, -1, -1],\n",
       " [-1, -1, -1],\n",
       " [1, 1, 1],\n",
       " [1, 1, 0],\n",
       " [1, 0, 1],\n",
       " [1, 1, 1],\n",
       " [0, 0, 1],\n",
       " [-1, -1, -1],\n",
       " [1, 1, 1],\n",
       " [1, 1, 1],\n",
       " [1, 1, 1],\n",
       " [1, 1, 1],\n",
       " [1, 1, 1]]"
      ]
     },
     "execution_count": 176,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[res_output(i) for i in pre_res_l]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_buy_sell_signal(pre_res,seq_len = 3):\n",
    "    '''\n",
    "    由于预测的是未来n个月（n=3）的的情况，预测有重合部分，将重合部分取平均，基于均值做买卖决策，提高精度\n",
    "    '''\n",
    "    length = len(pre_res)\n",
    "    l = []\n",
    "    for i in range(length):\n",
    "        if seq_len == 3:\n",
    "            if i == 0:\n",
    "                l.append(pre_res[0][0])\n",
    "            elif i == 1:\n",
    "                s = (pre_res[0][1]+pre_res[1][0])/2\n",
    "                l.append(s)\n",
    "            elif i == length-1:\n",
    "                l.append((pre_res[i][0]+pre_res[i-1][1]+pre_res[i-2][2])/3)\n",
    "                l.append((pre_res[i][1]+pre_res[i-1][2])/2)\n",
    "                l.append(pre_res[i][2])\n",
    "            else:\n",
    "                t = (pre_res[i][0]+pre_res[i-1][1]+pre_res[i-2][2])/3\n",
    "                l.append(t)\n",
    "        elif seq_len == 2:\n",
    "            if i == 0:\n",
    "                l.append(pre_res[0][0])\n",
    "            elif i == 1:\n",
    "                s = (pre_res[0][1]+pre_res[1][0])/2\n",
    "                l.append(s)\n",
    "            elif i == length-1:\n",
    "                l.append((pre_res[i][0]+pre_res[i-1][1])/2)\n",
    "                l.append(pre_res[i][1])\n",
    "            else:\n",
    "                t = (pre_res[i][0]+pre_res[i-1][1])/2\n",
    "                l.append(t)\n",
    "    return l\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {},
   "outputs": [],
   "source": [
    "bs_signal = get_buy_sell_signal([res_output(i) for i in pre_res_l], seq_len = 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[-1,\n",
       " -1.0,\n",
       " -1.0,\n",
       " -1.0,\n",
       " -1.0,\n",
       " -1.0,\n",
       " -1.0,\n",
       " -1.0,\n",
       " -0.3333333333333333,\n",
       " 0.3333333333333333,\n",
       " 1.0,\n",
       " 0.3333333333333333,\n",
       " 0.6666666666666666,\n",
       " 0.0,\n",
       " 0.3333333333333333,\n",
       " 0.3333333333333333,\n",
       " 1.0,\n",
       " 1.0,\n",
       " 1.0,\n",
       " 1.0,\n",
       " 1]"
      ]
     },
     "execution_count": 179,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bs_signal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_buy_month_list(signal,test_start_date,test_end_date):\n",
    "    test_month = get_month_list(test_start_date,test_end_date)\n",
    "    length = len(signal)\n",
    "    dic = {}\n",
    "    for i in range(next_n,length+1):\n",
    "        l = []\n",
    "        for j in range(next_n):\n",
    "            l.append(signal[i-(next_n-j)])\n",
    "        dic[test_month[i-next_n]] = l\n",
    "    return dic\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {},
   "outputs": [],
   "source": [
    "dic = get_buy_month_list(bs_signal,test_start_date,test_end_date)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'2018-06': [-1, -1.0, -1.0],\n",
       " '2018-07': [-1.0, -1.0, -1.0],\n",
       " '2018-08': [-1.0, -1.0, -1.0],\n",
       " '2018-09': [-1.0, -1.0, -1.0],\n",
       " '2018-10': [-1.0, -1.0, -1.0],\n",
       " '2018-11': [-1.0, -1.0, -1.0],\n",
       " '2018-12': [-1.0, -1.0, -0.3333333333333333],\n",
       " '2019-01': [-1.0, -0.3333333333333333, 0.3333333333333333],\n",
       " '2019-02': [-0.3333333333333333, 0.3333333333333333, 1.0],\n",
       " '2019-03': [0.3333333333333333, 1.0, 0.3333333333333333],\n",
       " '2019-04': [1.0, 0.3333333333333333, 0.6666666666666666],\n",
       " '2019-05': [0.3333333333333333, 0.6666666666666666, 0.0],\n",
       " '2019-06': [0.6666666666666666, 0.0, 0.3333333333333333],\n",
       " '2019-07': [0.0, 0.3333333333333333, 0.3333333333333333],\n",
       " '2019-08': [0.3333333333333333, 0.3333333333333333, 1.0],\n",
       " '2019-09': [0.3333333333333333, 1.0, 1.0],\n",
       " '2019-10': [1.0, 1.0, 1.0],\n",
       " '2019-11': [1.0, 1.0, 1.0],\n",
       " '2019-12': [1.0, 1.0, 1]}"
      ]
     },
     "execution_count": 182,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dic"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_month_buy_signal(dic,test_start_date,test_end_date,seq_len = 3):\n",
    "    '''\n",
    "    获取每月买卖信号，卖出信号为[0,0,0]、[1,0,0]、[0,1,0],[1,1,0]其余为买入信号，信号分析没有考虑做空\n",
    "    input:\n",
    "    dic: dic,key为月份，value为对应的信号\n",
    "    ''' \n",
    "    test_month = get_month_list(test_start_date,test_end_date)\n",
    "    dic_month_signal = OrderedDict()\n",
    "    for m in test_month:\n",
    "        l = dic[m]\n",
    "        if seq_len ==3:\n",
    "            if (l[0]<0.5) & (l[1]<0.5) & (l[2]<0.5):\n",
    "                dic_month_signal[m] = 0\n",
    "            elif (l[0]>0.5) & (l[1]<0.5) & (l[2]<0.5):\n",
    "                dic_month_signal[m] = 0\n",
    "            #elif (l[0]<0.5) & (l[1]>0.5) & (l[2]<0.5):\n",
    "                #dic_month_signal[m] = 0\n",
    "            elif (l[0]>0.5) & (l[1]>0.5) & (l[2]<0.5):\n",
    "                dic_month_signal[m] = 0\n",
    "            else:\n",
    "                dic_month_signal[m] = 1\n",
    "        elif seq_len ==2:\n",
    "            if (l[1]<0.5):\n",
    "                dic_month_signal[m] = 0\n",
    "            else:\n",
    "                dic_month_signal[m] = 1\n",
    "    v = list(dic_month_signal.values())\n",
    "    df = pd.DataFrame(v,index=dic_month_signal.keys(),columns=['signal'])\n",
    "    return df\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "metadata": {},
   "outputs": [],
   "source": [
    "month_signal = get_month_buy_signal(dic,test_start_date,test_end_date,seq_len = 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>signal</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-06</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-07</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-08</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-09</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-11</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-12</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-03</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-04</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-06</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-07</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-08</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-09</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-10</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-11</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-12</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         signal\n",
       "2018-06       0\n",
       "2018-07       0\n",
       "2018-08       0\n",
       "2018-09       0\n",
       "2018-10       0\n",
       "2018-11       0\n",
       "2018-12       0\n",
       "2019-01       0\n",
       "2019-02       1\n",
       "2019-03       1\n",
       "2019-04       1\n",
       "2019-05       1\n",
       "2019-06       0\n",
       "2019-07       0\n",
       "2019-08       1\n",
       "2019-09       1\n",
       "2019-10       1\n",
       "2019-11       1\n",
       "2019-12       1"
      ]
     },
     "execution_count": 185,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "month_signal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_month_profit(stocks,start_date,end_date):\n",
    "    '''\n",
    "    获取月收益率数据，数据为本月相对于上月的增长率，计算时用每月最后MONTH_MEAN_DAY_NUM天的均值\n",
    "    input:\n",
    "    data:dataframe,index为股票代码，values为因子值\n",
    "    start_date:str, 初始日期\n",
    "    end_date:str,终止日期\n",
    "    output:\n",
    "    month_profit_df: Dataframe,columns为每月第一天的收盘价\n",
    "    \n",
    "    '''\n",
    "    start_year = int(start_date[:4])\n",
    "    end_year = int(end_date[:4])\n",
    "    start_month = int(start_date[5:7])\n",
    "    end_month = int(end_date[5:7])\n",
    "    len_month = (end_year - start_year)*12 + (end_month - start_month) + 2\n",
    "    price_list = []\n",
    "    month = start_month-1\n",
    "    year = start_year\n",
    "    for i in range(len_month):\n",
    "        year = year + (month + 1) // 13\n",
    "        month = month % 12 + 1\n",
    "        date_s = str(year)+'-'+str(month)+'-'+'01'\n",
    "        date_e = str(year)+'-'+str(month)+'-'+'20'\n",
    "        price_close = price.loc[date_s:date_e]['close'][0:1]\n",
    "        #print(price_close)\n",
    "        #price = get_price(stocks,fields=['close'],count=1,end_date=date)['close']\n",
    "        price_list.append(price_close)\n",
    "    month_profit = pd.concat(price_list,axis=0)\n",
    "    v = list(month_profit.values)\n",
    "    month_profit_df = pd.DataFrame(v,index=month_profit.index,columns=['profit'])\n",
    "    return month_profit_df\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "metadata": {},
   "outputs": [],
   "source": [
    "month_profit = get_month_profit(select_index,test_start_date,test_end_date)\n",
    "month_profit_pct = month_profit.pct_change(1,axis=0).dropna(how='all')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_strategy_profit(month_signal,month_profit_pct):\n",
    "    length_signal = len(month_signal)\n",
    "    length_pct = len(month_profit_pct)\n",
    "    if length_signal != length_pct:\n",
    "        print('input references must have same length')\n",
    "    month_profit_pct_shift = month_profit_pct['profit'].shift(-1)\n",
    "    month_signal['profit'] = month_profit_pct_shift.values\n",
    "\n",
    "    month_signal = month_signal.dropna()\n",
    "    month_signal['profit'][month_signal['signal']==0] = 0\n",
    "    month_signal['selct_profit'] = month_signal['profit']\n",
    "    month_signal['cumprod_profit'] = (month_signal['selct_profit']+1).cumprod()\n",
    "    month_signal['cumsum_profit'] = month_signal['selct_profit'].cumsum()\n",
    "    return month_signal\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "metadata": {},
   "outputs": [],
   "source": [
    "strategy_profit = get_strategy_profit(month_signal,month_profit_pct)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 190,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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VskwxkQDvzEfd6S/ALjDWmuNMa8A5wLvuo4/2M/wTuItsXY6z4B+quJF8QYBs4wxcdbZJ+h8nJ8Ce5QXxYsxJt5aW+y67RvAdf2Nr7PBjrU7rsftBpwlyE/18Jq95i3xDhZvitcYcyvO/l9rrKv/hid5MNbOj7uJwNXAGdZZGdj5cesHpBhjJgMncH4K+hlPxdODMXpNvAN937qu4RXxusYx1Vqb5fr+cuCQR4L8+NpeEau1Ng1I7LRfrbV2IFZ48op4XbeNtdYWuMZ0Jc6pGB7lTfHi7Au0GmcF0jk4m+d6jJfFCs7KulettY39i6zbMXpLvBVApDFmunX2CfL218ueeOy2Hx+Is4LwLk/E2OnagxqrG72+Zm95WbzDk/WC7t7D4Qs4C2cJ5T5gj+vrEpy9TtbjzAivB6Jd+yfizChXA5Wu7yNct/0C54uyAzhXBAns5ppfwtk3Jgv4YqftyTiz0Ptc15w4UmN13XYUSB0l9+3XcP4h3Ae8AsSM8HifxJkEPYhr5bIREOsmoARnMiIPuNC1fQrOprxZOCsIuzx+BMV7m+vnVpyfpD04wuNtxbmqSvs4fubFsW7C+Zjby2lWRHSdP8MV1086bR9u921/4x3Q+9ab4sVZob4FZ2++A8C/6bRa20iKtYt9Bmp1Nq+JF+eHj+337eNA2AiPNwpnVc5+nO0f5o/UWF23vQdcNBC/x94WL87eT/tdx78HTBnh8d6D8/3BYZxTr0ZCrE/i7EPZ4jr+Ftf2Lq85guO9yvVzE1AErBuox7Anv4xr8CIiIiIiIiIiIt1STyQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXFLSSQREREREREREXHLb6gH0BuxsbF20qRJQz0MEREREREREZERY9euXaXW2jh3+w2rJNKkSZPYuXPnUA9DRERERERERGTEMMbk9GQ/TWcTERERERERERG3lEQSERERERERERG3lEQSERERERERERG3lEQSERERERERERG3lEQSERERERERERG3lEQSERERERERERG3lEQSERERERERERG3lEQSERERERERERG3lEQSEREREY/42UsHeCutcKiHISIiIgNESSQRERER6beqhhYe/TCHBzcfG+qhiIiIyABREklERERE+i29oBqAXTkVVDW0DPFoREREZCAoiSQiIiIi/XYw35lEanNYtmSVDvFoREREZCAoiSQiIiIi/XawoJqY0AAigvzYcKh4qIcjIiIiA8BvqAcgIiIiIsPfwfxqZidFEh7kx3sZJVhrMcYM9bBERETEg1SJJCIiIiIAOBwWa22P9q1pbGF3bgV7jlfS3Oogs7iGWWMjOHd6HCU1TaS5preJiIjIyKFKJBERERGhoq6Z6x/4kPNmxHPHJTNPu29WcS2X/HkTzW0OjIHfXjWXljbLrHERrJgSDcDGjBLmJEUOxtBFRERkkKgSSURERGSUa2xp48uP7iSjqJZ9eVVu9z9SUktzm4OfXjaL2LBAfvZyGgCzxkYQHx7EnKQI9UUSEREZgZREEhERERnlfvt6OjtzKkiKCqaoptHt/uV1zQBcNCeRn1wyk+ZWB0H+PkyODQXgvBnxfJRbQVV9y4COW0RERAaXkkgiIiIio9iJygae2J7LZ5dP5ILZCRRV9TyJFBMawBULxnHWtFiWTorG18fZSPvcGXE4LLyfWTKgYxcREZHBpZ5IIiIiIiNYWW0Tr+8vICEiiOSYUCZGhxAc4Ntx+983ZAHwzfOm8fLefOqa26htaiUssPuXiWW1zYQG+BLk7zzPw19cetLtCyaMISrEn/cOl3D5/HEDEJWIiIgMBSWRREREREawh7dk81dXoqhdfHggyTEhTIwO5eW9J7h+6QTGRQWTGBEEQFF1I2FxYd2es7yuieiwgI6f/X1PLm739TGsSoljY0Yx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L6faByx0hlS24i7su95auxboWwHFGJMK/MAZVQFwPu5PB3vpEycvgilmxphMa22Vs++rwGf8vb5TzUjHS/wzjPHq//sxFvg0cKYzgq//75cLKDTGFAAVuD/J/exwXc+pJlji4/RjgrW2xLl9EfDhsFzkKSRY4uXsy7HWVjp9uhT3dBDpJ5ji5bgC9wIRbf5d2akrmGLW7/5RuEdg3D0c13gqGel4iX98jZcTi6eAa+2R+mAA6/Dwe2Ot3YZv75ODiw2C6t7aArMBZ+MeJrcZ2OhsH8ddIO9V3J8ivAqkOsdn486SNgL1zu1EZ99duF9EbwV+D0QN8JhfwF1PpwS44Zh9e4DJgX5egnkLppjhTvhtd7arAv3cBOMWoHitBqpxJ5vKgRVO+9ec77twf7LxcKCfn2Dbhjleq53fjU2cYOVC5/y7cK/c8e1+7YpXkMYH9yjut4Etzu/jH+m3Wpu24IqX0/5av3j9AYgP9PMTbFswxcvZ9wZwQaCfl2DegilmwI9wT+3diXvaT8Cfn2DbAhSvP+Oupdnp3P9Gp/1TzvftwEHgpUA/P8G2DSFeDwN1/Y5d3+9cA/6tO+YxB3rPda8Trx7n63cD/fwYp2MiIiIiIiIiIiIDUk0kERERERERERHxSkkkERERERERERHxSkkkERERERERERHxSkkkERERERERERHxSkkkERERERERERHxSkkkERERERERERHxSkkkERERERERERHxSkkkERERERERERHx6v8ATku7VSv9oN8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 1440x720 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sp_cumprod = strategy_profit['cumprod_profit']\n",
    "p_hs300 = price.loc[test_start_date:test_end_date]['close']\n",
    "#p_hs300 = get_price(select_index,start_date=test_start_date,end_date=test_end_date,fields=['close'])\n",
    "fig = plt.figure(figsize=(20,10))\n",
    "ax0 = fig.add_subplot(2,1,1)\n",
    "ax1 = fig.add_subplot(2,1,2)\n",
    "ax0.plot(sp_cumprod)\n",
    "ax1.plot(p_hs300)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 191,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>signal</th>\n",
       "      <th>profit</th>\n",
       "      <th>selct_profit</th>\n",
       "      <th>cumprod_profit</th>\n",
       "      <th>cumsum_profit</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-06</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-07</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-08</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-09</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-11</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-12</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02</th>\n",
       "      <td>1</td>\n",
       "      <td>0.059797</td>\n",
       "      <td>0.059797</td>\n",
       "      <td>1.059797</td>\n",
       "      <td>0.059797</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-03</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.072802</td>\n",
       "      <td>-0.072802</td>\n",
       "      <td>0.982641</td>\n",
       "      <td>-0.013005</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-04</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.014278</td>\n",
       "      <td>-0.014278</td>\n",
       "      <td>0.968611</td>\n",
       "      <td>-0.027284</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05</th>\n",
       "      <td>1</td>\n",
       "      <td>0.083645</td>\n",
       "      <td>0.083645</td>\n",
       "      <td>1.049631</td>\n",
       "      <td>0.056362</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-06</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.049631</td>\n",
       "      <td>0.056362</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-07</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.049631</td>\n",
       "      <td>0.056362</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-08</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.002765</td>\n",
       "      <td>-0.002765</td>\n",
       "      <td>1.046728</td>\n",
       "      <td>0.053597</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-09</th>\n",
       "      <td>1</td>\n",
       "      <td>0.029890</td>\n",
       "      <td>0.029890</td>\n",
       "      <td>1.078016</td>\n",
       "      <td>0.083487</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-10</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.029433</td>\n",
       "      <td>-0.029433</td>\n",
       "      <td>1.046287</td>\n",
       "      <td>0.054054</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-11</th>\n",
       "      <td>1</td>\n",
       "      <td>0.082423</td>\n",
       "      <td>0.082423</td>\n",
       "      <td>1.132525</td>\n",
       "      <td>0.136477</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         signal    profit  selct_profit  cumprod_profit  cumsum_profit\n",
       "2018-06       0  0.000000      0.000000        1.000000       0.000000\n",
       "2018-07       0  0.000000      0.000000        1.000000       0.000000\n",
       "2018-08       0  0.000000      0.000000        1.000000       0.000000\n",
       "2018-09       0  0.000000      0.000000        1.000000       0.000000\n",
       "2018-10       0  0.000000      0.000000        1.000000       0.000000\n",
       "2018-11       0  0.000000      0.000000        1.000000       0.000000\n",
       "2018-12       0  0.000000      0.000000        1.000000       0.000000\n",
       "2019-01       0  0.000000      0.000000        1.000000       0.000000\n",
       "2019-02       1  0.059797      0.059797        1.059797       0.059797\n",
       "2019-03       1 -0.072802     -0.072802        0.982641      -0.013005\n",
       "2019-04       1 -0.014278     -0.014278        0.968611      -0.027284\n",
       "2019-05       1  0.083645      0.083645        1.049631       0.056362\n",
       "2019-06       0  0.000000      0.000000        1.049631       0.056362\n",
       "2019-07       0  0.000000      0.000000        1.049631       0.056362\n",
       "2019-08       1 -0.002765     -0.002765        1.046728       0.053597\n",
       "2019-09       1  0.029890      0.029890        1.078016       0.083487\n",
       "2019-10       1 -0.029433     -0.029433        1.046287       0.054054\n",
       "2019-11       1  0.082423      0.082423        1.132525       0.136477"
      ]
     },
     "execution_count": 191,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "strategy_profit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "sp_cumprod = strategy_profit['cumprod_profit']\n",
    "p_hs300 = price.loc[test_start_date:test_end_date]['close']\n",
    "#p_hs300 = get_price(select_index,start_date=test_start_date,end_date=test_end_date,fields=['close'])\n",
    "fig = plt.figure(figsize=(20,10))\n",
    "ax0 = fig.add_subplot(2,1,1)\n",
    "ax1 = fig.add_subplot(2,1,2)\n",
    "ax0.plot(sp_cumprod)\n",
    "ax1.plot(p_hs300)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:py35]",
   "language": "python",
   "name": "conda-env-py35-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
